import { ipcRenderer, shell } from 'electron'

import route, { routeInfo } from './route'
import lang from './lang'
import ui, { loading, message, notify, alert } from './ui'
import storage from './storage'
import plugin from './plugin'
import money from './money'
import barcode from './barcode'
import language from '@/lang'
import time from './time'
import math from './math'
import img from './img'

const app = {
  // 首次运行
  async run(vue) {
    // 语言初始化
    await this.lang.run(vue)

    // 挂载路由
    vue.use(route)
    
    // 挂载UI
    vue.use(ui)

    // 挂载
    vue.mount('#app')
  },

  // 收银台帐号
  account(info) {
    if(info) {
      storage.set('account', info)
      // 更新收银台帐号列表
      this.accountList(info)
    }
    return storage.get('account')
  },

  // 收银台帐号列表
  accountList(info) {
    const list = storage.get('account-list') || []
    // 插入帐号列表
    if(info) {
      // 删除历史帐号
      const index = list.findIndex(item => item === info)
      if(index !== -1) list.splice(index, 1)
      // 记录新帐号
      list.unshift(info)
      // 更新列表
      storage.set('account-list', list)
    }
    return list
  },
  
  // 获取或设置token
  token(token) {
    if(token) {
      storage.set('token', token)
    }
    return storage.get('token')
  },

  // 获取收银台 token
  tokenCheckout(token) {
    if(token) {
      storage.set('token-checkout', token)
    }
    if(token === false) {
      storage.del('token-checkout')
    }
    return storage.get('token-checkout')
  },

  // 登出
  logout() {
    storage.del('token')
    storage.del('user')
    this.route.to('/')
  },

  // 路由
  route: {
    // 跳转
    to(...arge) {
      route.push(...arge)
    },

    // 当前路由信息
    info() {
      return routeInfo()
    },

    // 后退
    back() {
      route.back()
    },

    // 添加路由
    add(obj) {
      route.addRoute(obj)
    }
  },

  // 语言操作
  lang: {
    // 语言列表
    list: [],

    // 初始化
    async run(vue) {
      // 整理语言包
      this.list = language.list
      
      // 获取默认语言
      let code = storage.get('lang')
      // 默认为列表第一个
      if(!code) {
        code = this.list[0].code
      }

      // 加载语言
      lang.run(code, language.messages)

      // 挂载多语言
      vue.use(lang.i18n)
    },

    // 设置语言
    set(code) {
      lang.set(code)
      storage.set('lang', code)
    },

    // 使用翻译
    t(...arge) {
      return lang.t(...arge)
    },

    // 原样翻译
    tm(...arge) {
      return lang.tm(...arge)
    },

    // 重置语言
    messages(code) {
      return lang.messages(code)
    }
  },

  // 窗口操作
  window: {
    info() {
      return ipcRenderer.sendSync('window-info')
    },

    min() {
      ipcRenderer.send('window-min')
    },

    full() {
      ipcRenderer.send('window-full')
    },

    exit() {
      ipcRenderer.send('exit')
    },
    reboot() {
      ipcRenderer.send('reboot')
    },
    version() {
      return ipcRenderer.sendSync('version')
    },

    update() {
      return ipcRenderer.send('auto-update')
    },

    appPath() {
      return process.cwd();
    },
    
    path(name) {
      return ipcRenderer.sendSync('path', name)
    },

    dialogOpen(options) {
      return ipcRenderer.sendSync('dialog-open', options)
    },

    dialogSave(options) {
      return ipcRenderer.sendSync('dialog-save', options)
    },

    fileShow(file) {
      shell.showItemInFolder(file)
    },

    fileOpen(file) {
      shell.openPath(file)
    },

    openUrl(url) {
      shell.openExternal(url)
    },

    getPrinters() {
      return ipcRenderer.sendSync('get-printers')
    },

    // 显示PDF
    pdfShow(path) {
      ipcRenderer.send('pdf-show', path)
    },

    // 新窗口
    newWin(url) {
      ipcRenderer.send('new-win', url)
    },

    // 获取缩放
    getZoom() {
      return ipcRenderer.sendSync('zoom')
    },

    // 配置
    setZoom(zoom) {
      ipcRenderer.send('zoom-set', zoom)
    }
  },

  // ui 操作
  ui: {
    loadingService: {},
    loading() {
      this.loadingService = loading.service()
    },
    loadingBlack() {
      this.loadingService = loading.service({
        background: 'rgba(0, 0, 0, 0.5)'
      })
    },
    loadingClose() {
      this.loadingService.close()
    },
    message(type, msg, name) {
      return message({ type, message: app.lang.t((name ? name + '.' : '') + 'message.' + msg), offset: 100 })
    },
    notify(type, title, message) {
      if(typeof type === 'object') {
        return notify(type)
      }
      return notify({ type, title , message, offset: 100 })
    },
    alert(message, title, data) {
      return alert(Object.assign({ title, message }, data))
    }
  },

  // 插件
  plugin: {
    // 当前插件
    index: {},
    // 常用插件
    local: [],
    // 引导插件列表
    boot: {},

    // 引导插件
    boostrap(name, arge) {
      if(this.boot[name]) {
        this.boot[name].forEach(boot => {
          boot(arge)
        })
      }
    },
    
    // 注册插件
    register(name, func) {
      if(!this.boot[name]) {
        this.boot[name] = []
      }
      this.boot[name].push(func)
    },

    // 加载列表
    list(data) {
      const listData = []
      data.forEach(item => {
        listData.push(this.load(item))
      })

      return listData
    },

    // 加载单个
    load(data) {
      return new plugin(app, data)
    },

    // 过滤插件
    filter(list, ids) {
      return list.filter(item => {
        return ids.includes(item.id())
      })
    },

    // 打开插件
    open(plugin) {
      app.route.to(plugin.url())
      // 记录插件
      this.index = plugin
    },

    // 加载常用插件
    loadLocal(plugin) {
      const ids = storage.get('plugin-local') || []
      // 准备过滤
      this.local = this.filter(plugin, ids)
    },

    // 常用插件是否存在
    isLocal(plugin) {
      return this.local.findIndex(item => item.key() === plugin.key())
    },

    // 常用插件加入或删除
    makeLocal(plugin) {
      const index = this.isLocal(plugin)

      if(index !== -1) {
        this.local.splice(index, 1)
      } else {
        this.local.unshift(plugin)
      }

      // 记录缓存
      storage.set('plugin-local', this.local.map(item => {
        return item.id()
      }))
    }
  },

  // 时间操作
  time,

  // 金额
  money: (value, show = true) => {
    return money(value, show)
  },

  // 条码
  barcode: (...arge) => {
    return barcode(...arge)
  },

  // 精度处理
  math,
  img,
  storage
}

export default app